package top.jacktgq.hsp.nio.buffer_channel;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @Author CandyWall
 * @Date 2020/11/11--13:54
 * @Description MappedByteBuffer
 *                 1、可以让文件直接在内存（堆外内存）中修改，操作系统不需要拷贝一次
 */
public class MappedByteBufferDemo {
    public static void main(String[] args) {
        RandomAccessFile randomAccessFile = null;
        try {
            randomAccessFile = new RandomAccessFile("tmp/file04.txt", "rw");
            //获取对应的FileChannel
            FileChannel fileChannel = randomAccessFile.getChannel();
            //参数1：使用的是读写模式
            //参数2：可以直接修改的起始位置
            //参数3：映射到内存的大小，即将文件1.txt的多少个字节映射到内存
            //可以直接修改的范围就是[0-5)，5是大小，不是索引
            MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, 5);
            mappedByteBuffer.put(0, (byte) 'H');
            mappedByteBuffer.put(3, (byte) '9');
            //mappedByteBuffer.put(5, (byte) '9');    //IndexOutOfBoundsException
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                randomAccessFile.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println("修改成功");
    }
}
